#define   E_PWM
#include "H/PWM.H"
/*****************************************************
*函数名称：void PWM_INIT()
*函数功能：PWM0~5初始化
*入口参数：void
*出口参数：void
*****************************************************/
void PWM_INIT()
{     
    #if PWM0_EN
    PWM0_OUT;                     //PWM0 IO做输出口,若非--P07口--需重新映射PWM0_OUT IO
    PWM0_OD_OFF;                  //PWM0 IO开漏关闭,若非--P07口--需重新映射PWM0_OD_OFF IO
    MAP3   = D_PWM0_P07;          //PWM0由P07输出
    PWMD0L=0xFF;                  //PWM0占空比，初始值为0% 
    PWMD0H=0xFF;                  //PWM0占空比，初始值为0%
    #endif
    
    #if PWM1_EN
    PWM1_OUT;                     //PWM1 IO做输出口,若非--P10口--需重新映射PWM1_OUT IO
    PWM1_OD_OFF;                  //PWM1 IO开漏关闭,若非--P10口--需重新映射PWM1_OD_OFF IO
    MAP4   = D_PWM1_P10;          //PWM1由P10输出
    PWMD1L=0xFF;                  //PWM1占空比，初始值为0% 
    PWMD1H=0xFF;                  //PWM1占空比，初始值为0%
    #endif

    #if PWM2_EN
    PWM2_OUT;                     //PWM2 IO做输出口
    PWM2_OD_OFF;                  //PWM2 IO开漏关闭   
    PWMD2L=0xFF;                  //PWM2占空比，初始值为0% 
    PWMD2H=0xFF;                  //PWM2占空比，初始值为0%
    #endif

    #if PWM3_EN
    PWM3_OUT;                     //PWM3 IO做输出口
    PWM3_OD_OFF;                  //PWM3 IO开漏关闭
    PWMD3L=0xFF;                  //PWM3占空比，初始值为0% 
    PWMD3H=0xFF;                  //PWM3占空比，初始值为0%
    #endif

    #if PWM4_EN
    PWM4_OUT;                     //PWM4 IO做输出口
    PWM4_OD_OFF;                  //PWM4 IO开漏关闭   
    PWMD4L=0xFF;                  //PWM4占空比，初始值为0% 
    PWMD4H=0xFF;                  //PWM4占空比，初始值为0%
    #endif

    #if PWM5_EN
    PWM5_OUT;                     //PWM5 IO做输出口
    PWM5_OD_OFF;                  //PWM5 IO开漏关闭  
    PWMD5L=0xFF;                  //PWM5占空比，初始值为0% 
    PWMD5H=0xFF;                  //PWM5占空比，初始值为0%
    #endif

    PWMCON0=PWM3C(D_PWM3C_TIMER)|PWM4C(D_PWM4C_TIMER)|PWM4C(D_PWM4C_TIMER);//PWM3~5均有timer2产生

    PWMCON2=PWM5S_TMAXD_H\ 
           |PWM4S_TMAXD_H\ 
           |PWM3S_TMAXD_H\ 
           |PWM2S_TMAXD_H\ 
           |PWM1S_TMAXD_H\ 
           |PWM0S_TMAXD_H;        //TIMERX计数值大于PWMDX输出高电平,即_H尾缀表示高电平占比，_L尾缀表示低电平占比

    PWMIECFG=PWMIES_DOWN|PWMIS(0);//PWM下降沿触发|PWM0触发中断
    PWMCNT=3;                     //被选中的PWM产生次数，用于产生PWM中断

    PWMCON1=PWM5EN(PWM5_EN)|PWM4EN(PWM4_EN)|PWM3EN(PWM3_EN)|PWM2EN(PWM2_EN)|PWM1EN(PWM1_EN)|PWM0EN(PWM0_EN); //PWM使能

    IOSET   = OLDIS(2)|PUDIS(4);  //设置IOL电流=30mA;IOH电流=14mA 

    #if PWM0_EN||PWM1_EN||PWM2_EN||((D_PWM3C_TIMER==0)&&PWM3_EN)||((D_PWM4C_TIMER==0)&&PWM4_EN)||((D_PWM5C_TIMER==0)&&PWM5_EN)
    T1OVRL=D_PWM_T1CL;  //T1时钟PWM频率设置  
    T1OVRH=D_PWM_T1CH;  //T1时钟PWM频率设置
    T1CON=PWM_T1FS(D_PWM_T1FS0)|PWM_T1EN_EN;//定时分频|使能Timer1
    #endif

    #if ((D_PWM3C_TIMER==1)&&PWM3_EN)||((D_PWM4C_TIMER==1)&&PWM4_EN)||((D_PWM5C_TIMER==1)&&PWM5_EN)
    T2OVRL=D_PWM_T2CL;  //T2时钟PWM频率设置
    T2OVRH=D_PWM_T2CH;  //T2时钟PWM频率设置
    T2CON=PWM_T2FS(D_PWM_T2FS0)|PWM_T2EN_EN;//定时分频|使能Timer2 
    #endif

//    PWMIE=1;  //使能PWM中断
//    EA=1; 
}

/*****************************************************
*函数名称：void PWM0_INIT()
*函数功能：PWM0初始化，注意仅开PWM0使用
*入口参数：void
*出口参数：void
*****************************************************/
#if PWM0_EN
void PWM0_INIT()
{
    IOSET  = OLDIS(2)|PUDIS(4);	//设置IOL电流=30mA;IOH电流=14mA     
    
    PWM0_OUT;                     //PWM0 IO做输出口,若非P07口需重新映射PWM0_OUT IO

    PWM0_OD_OFF;                  //PWM0 IO开漏关闭,若非P07口需重新映射PWM0_OD_OFF IO

    MAP3  = D_PWM0_P07;           //PWM0由P07输出

    T1OVRL=D_PWM_T1CL;            //PWM频率设置
    T1OVRH=D_PWM_T1CH;            //PWM频率设置

    PWMD0L=0xFF;                  //PWM0占空比，初始值为0% 
    PWMD0H=0xFF;                  //PWM0占空比，初始值为0%

    PWMCON2=PWM0S_TMAXD_H;        //TIMERX计数值大于PWMDX输出高电平

    PWMIECFG=PWMIES_DOWN|PWMIS(0);//PWM下降沿触发|PWM0触发中断
    PWMCNT=3;                     //被选中的PWM产生次数，用于产生PWM中断

    PWM0_ON;                      //PWM0使能 (PWM0_OFF 为PWM0不使能)

    T1CON=PWM_T1FS(D_PWM_T1FS0)|PWM_T1EN_EN;//定时分频|使能Timer1
//    PWMIE=1;                    //使能PWM中断
//    EA=1; 
}
#endif

/*****************************************************
*函数名称：void PWM1_INIT()
*函数功能：PWM1初始化，注意仅开PWM1使用
*入口参数：void
*出口参数：void
*****************************************************/
#if PWM1_EN
void PWM1_INIT()
{
    IOSET  = OLDIS(2)|PUDIS(4);	 //设置IOL电流=30mA;IOH电流=14mA     
    
    PWM1_OUT;                     //PWM1 IO做输出口,若非P10口需重新映射PWM1_OUT IO

    PWM1_OD_OFF;                  //PWM1 IO开漏关闭,若非P10口需重新映射PWM1_OD_OFF IO

    MAP4   = D_PWM1_P10;          //PWM1由P10输出

    T1OVRL=D_PWM_T1CL;            //PWM频率设置
    T1OVRH=D_PWM_T1CH;            //PWM频率设置

    PWMD1L=0xFF;                  //PWM0占空比，初始值为0% 
    PWMD1H=0xFF;                  //PWM0占空比，初始值为0%

    PWMCON2=PWM1S_TMAXD_H;        //TIMERX计数值大于PWMDX输出高电平

    PWMIECFG=PWMIES_DOWN|PWMIS(1);//PWM下降沿触发|PWM1触发中断
    PWMCNT=3;                     //被选中的PWM产生次数，用于产生PWM中断

    PWM1_ON;                      //PWM1使能 (PWM1_OFF 为PWM1不使能)

    T1CON=PWM_T1FS(D_PWM_T1FS0)|PWM_T1EN_EN;//定时分频|使能Timer1
//    PWMIE=1;                    //使能PWM中断
//    EA=1; 
}
#endif
/*****************************************************
*函数名称：void PWM2_INIT()
*函数功能：PWM2初始化，注意仅开PWM2使用
*入口参数：void
*出口参数：void
*****************************************************/
#if PWM2_EN
void PWM2_INIT()
{
    IOSET  = OLDIS(2)|PUDIS(4);	 //设置IOL电流=30mA;IOH电流=14mA     
    
    PWM2_OUT;                     //PWM2 IO做输出口

    PWM2_OD_OFF;                  //PWM2 IO开漏关闭

    T1OVRL=D_PWM_T1CL;            //PWM频率设置
    T1OVRH=D_PWM_T1CH;            //PWM频率设置

    PWMD2L=0xFF;                 //PWM0占空比，初始值为0% 
    PWMD2H=0xFF;                 //PWM0占空比，初始值为0%

    PWMCON2=PWM2S_TMAXD_H;        //TIMERX计数值大于PWMDX输出高电平

    PWMIECFG=PWMIES_DOWN|PWMIS(2);//PWM下降沿触发|PWM2触发中断
    PWMCNT=3;                     //被选中的PWM产生次数，用于产生PWM中断

    PWM2_ON;                      //PWM2使能 (PWM2_OFF 为PWM2不使能)

    T1CON=PWM_T1FS(D_PWM_T1FS0)|PWM_T1EN_EN;//定时分频|使能Timer1
//    PWMIE=1;                    //使能PWM中断
//    EA=1; 
}
#endif
/*****************************************************
*函数名称：void PWM3_INIT()
*函数功能：PWM3初始化，注意仅开PWM3使用
*入口参数：void
*出口参数：void
*****************************************************/
#if PWM3_EN
void PWM3_INIT()
{
    IOSET  = OLDIS(2)|PUDIS(4);	 //设置IOL电流=30mA;IOH电流=14mA     
    
    PWM3_OUT;                     //PWM3 IO做输出口

    PWM3_OD_OFF;                  //PWM3 IO开漏关闭

    PWMCON0=PWM3C(D_PWM3C_TIMER); //PWM3由 timerX产生

    PWMCON2=PWM3S_TMAXD_H;        //TIMERX计数值大于PWMDX输出高电平

    PWMIECFG=PWMIES_DOWN|PWMIS(3);//PWM3下降沿触发|PWM3触发中断
    PWMCNT=3;                     //被选中的PWM产生次数，用于产生PWM中断

    PWMD3L=0xFF;                  //PWM3占空比，初始值为0% 
    PWMD3H=0xFF;                  //PWM3占空比，初始值为0%

    PWM3_ON;                      //PWM3使能 (PWM3_OFF 为PWM3不使能)

    #if D_PWM3C_TIMER==1
    T2OVRL=D_PWM_T2CL;            //PWM3频率设置
    T2OVRH=D_PWM_T2CH;            //PWM3频率设置
    T2CON=PWM_T2FS(D_PWM_T2FS0)|PWM_T2EN_EN;//定时分频|使能Timer2    
    #else
    T1OVRL=D_PWM_T1CL;            //PWM3频率设置
    T1OVRH=D_PWM_T1CH;            //PWM3频率设置 
    T1CON=PWM_T1FS(D_PWM_T1FS0)|PWM_T1EN_EN;//定时分频|使能Timer1    
    #endif 
//    PWMIE=1;                    //使能PWM中断
//    EA=1; 
}
#endif
/*****************************************************
*函数名称：void PWM4_INIT()
*函数功能：PWM4初始化，注意仅开PWM4使用
*入口参数：void
*出口参数：void
*****************************************************/
#if PWM4_EN
void PWM4_INIT()
{
    IOSET  = OLDIS(2)|PUDIS(4);	 //设置IOL电流=30mA;IOH电流=14mA     
   
    PWM4_OUT;                     //PWM4 IO做输出口

    PWM4_OD_OFF;                  //PWM4 IO开漏关闭

    PWMCON0=PWM4C(D_PWM4C_TIMER); //PWM4由 timerX产生

    PWMCON2=PWM4S_TMAXD_H;        //TIMERX计数值大于PWMDX输出高电平

    PWMIECFG=PWMIES_DOWN|PWMIS(4);//PWM4下降沿触发|PWM4触发中断
    PWMCNT=3;                     //被选中的PWM产生次数，用于产生PWM中断
 
    PWMD4L=0xFF;                  //PWM4占空比，初始值为0% 
    PWMD4H=0xFF;                  //PWM4占空比，初始值为0%  

    PWM4_ON;                      //PWM4使能 (PWM4_OFF 为PWM4不使能)

    #if D_PWM4C_TIMER==1
    T2OVRL=D_PWM_T2CL;            //PWM4频率设置
    T2OVRH=D_PWM_T2CH;            //PWM4频率设置
    T2CON=PWM_T2FS(D_PWM_T2FS0)|PWM_T2EN_EN;//定时分频|使能Timer2   
    #else
    T1OVRL=D_PWM_T1CL;            //PWM4频率设置
    T1OVRH=D_PWM_T1CH;            //PWM4频率设置
    T1CON=PWM_T1FS(D_PWM_T1FS0)|PWM_T1EN_EN;//定时分频|使能Timer1   
    #endif 
 
//    PWMIE=1;                    //使能PWM中断
//    EA=1; 
}
#endif
/*****************************************************
*函数名称：void PWM5_INIT()
*函数功能：PWM5初始化，注意仅开PWM5使用
*入口参数：void
*出口参数：void
*****************************************************/
#if PWM5_EN
void PWM5_INIT()
{
    IOSET  = OLDIS(2)|PUDIS(4);	 //设置IOL电流=30mA;IOH电流=14mA     
   
    PWM5_OUT;                     //PWM5 IO做输出口

    PWM5_OD_OFF;                  //PWM5 IO开漏关闭

    PWMCON0=PWM5C(D_PWM5C_TIMER); //PWM5由 timerX产生

    PWMCON2=PWM5S_TMAXD_H;        //TIMERX计数值大于PWMDX输出高电平

    PWMIECFG=PWMIES_DOWN|PWMIS(5);//PWM5下降沿触发|PWM5触发中断
    PWMCNT=3;                     //被选中的PWM产生次数，用于产生PWM中断

 
    PWMD5L=0xFF;                  //PWM5占空比，初始值为0% 
    PWMD5H=0xFF;                  //PWM5占空比，初始值为0%  

    PWM5_ON;                      //PWM5使能 (PWM5_OFF 为PWM5不使能)

    #if D_PWM5C_TIMER==1
    T2OVRL=D_PWM_T2CL;            //PWM5频率设置
    T2OVRH=D_PWM_T2CH;            //PWM5频率设置
    T2CON=PWM_T2FS(D_PWM_T2FS0)|PWM_T2EN_EN;//定时分频|使能Timer2     
    #else
    T1OVRL=D_PWM_T1CL;            //PWM5频率设置
    T1OVRH=D_PWM_T1CH;            //PWM5频率设置 
    T1CON=PWM_T1FS(D_PWM_T1FS0)|PWM_T1EN_EN;//定时分频|使能Timer1
    #endif 

//    PWMIE=1;                    //使能PWM中断
//    EA=1; 
}
#endif
/*****************************************************
*函数名称：void PWM0_DUTY(uint R_DUTY)
*函数功能：调整PWM0级数，R_DUTY为所需占空比级数，
           如共128级，R_DUTY=64表示占空比设置为50%，
           如共128级，R_DUTY=102表示占空比设置为79.68%，
*入口参数：uint R_DUTY为所需占空比级数 
*出口参数：void
*****************************************************/
void PWM0_DUTY(uint R_DUTY)
{
    volatile uint i=65535-R_DUTY;
    PWMD0L=(uchar)i;
    PWMD0H=(uchar)(i>>8);
}
/*****************************************************
*函数名称：void PWM1_DUTY(uint R_DUTY)
*函数功能：调整PWM1级数，R_DUTY为所需占空比级数，
           如共128级，R_DUTY=64表示占空比设置为50%，
           如共128级，R_DUTY=102表示占空比设置为79.68%，
*入口参数：uint R_DUTY为所需占空比级数 
*出口参数：void
*****************************************************/
void PWM1_DUTY(uint R_DUTY)
{
    volatile uint i=65535-R_DUTY;
    PWMD1L=(uchar)i;
    PWMD1H=(uchar)(i>>8);
}
/*****************************************************
*函数名称：void PWM2_DUTY(uint R_DUTY)
*函数功能：调整PWM2级数，R_DUTY为所需占空比级数，
           如共128级，R_DUTY=64表示占空比设置为50%，
           如共128级，R_DUTY=102表示占空比设置为79.68%，
*入口参数：uint R_DUTY为所需占空比级数 
*出口参数：void
*****************************************************/
void PWM2_DUTY(uint R_DUTY)
{
    volatile uint i=65535-R_DUTY;
    PWMD2L=(uchar)i;
    PWMD2H=(uchar)(i>>8);
}
/*****************************************************
*函数名称：void PWM3_DUTY(uint R_DUTY)
*函数功能：调整PWM3级数，R_DUTY为所需占空比级数，
           如共128级，R_DUTY=64表示占空比设置为50%，
           如共128级，R_DUTY=102表示占空比设置为79.68%，
*入口参数：uint R_DUTY为所需占空比级数 
*出口参数：void
*****************************************************/
void PWM3_DUTY(uint R_DUTY)
{
    volatile uint i=65535-R_DUTY;
    PWMD3L=(uchar)i;
    PWMD3H=(uchar)(i>>8);
}
/*****************************************************
*函数名称：void PWM4_DUTY(uint R_DUTY)
*函数功能：调整PWM4级数，R_DUTY为所需占空比级数，
           如共128级，R_DUTY=64表示占空比设置为50%，
           如共128级，R_DUTY=102表示占空比设置为79.68%，
*入口参数：uint R_DUTY为所需占空比级数 
*出口参数：void
*****************************************************/
void PWM4_DUTY(uint R_DUTY)
{
    volatile uint i=65535-R_DUTY;
    PWMD4L=(uchar)i;
    PWMD4H=(uchar)(i>>8);
}
/*****************************************************
*函数名称：void PWM5_DUTY(uint R_DUTY)
*函数功能：调整PWM5级数，R_DUTY为所需占空比级数，
           如共128级，R_DUTY=64表示占空比设置为50%，
           如共128级，R_DUTY=102表示占空比设置为79.68%，
*入口参数：uint R_DUTY为所需占空比级数 
*出口参数：void
*****************************************************/
void PWM5_DUTY(uint R_DUTY)
{
    volatile uint i=65535-R_DUTY;
    PWMD5L=(uchar)i;
    PWMD5H=(uchar)(i>>8);
}
